#include "map.h"
#include "tile.h"
#include "buildable.h"

//////////////////////////////////////////////////
//  Map::Map()
//////////////////////////////////////////////////
Map::Map() :
    width(16),
    height(16),
    gridSize(16)
{

}

//////////////////////////////////////////////////
//  Map::Map(int width, int height)
//////////////////////////////////////////////////
Map::Map(int width, int height) :
    gridSize(16)
{
    this->width = width;
    this->height = height;
    arraySize = width*height;

    grid = new Tile*[arraySize];

    for (int i = 0; i < arraySize; i++)
    {
        grid[i] = new Tile(sf::Vector2i(i%height, i/height));
    }

    getTile(1, 0)->setChild(new Buildable);
}

//////////////////////////////////////////////////
//  void Map::eventHandle(sf::Event event)
//////////////////////////////////////////////////
void Map::eventHandle(sf::Event event)
{

}

//////////////////////////////////////////////////
//  void Map::inputHandle()
//////////////////////////////////////////////////
void Map::inputHandle()
{

}

//////////////////////////////////////////////////
//  void Map::update(double dt)
//////////////////////////////////////////////////
void Map::update(double dt)
{

}

//////////////////////////////////////////////////
//  void Map::tick()
//////////////////////////////////////////////////
void Map::tick()
{
    for (int i = 0; i < arraySize; i++)
    {
        grid[i]->tick();
    }
}

//////////////////////////////////////////////////
//  void Map::load(String filename)
//////////////////////////////////////////////////
void Map::load(String filename)
{

}

//////////////////////////////////////////////////
//  Tile* Map::getTile(int x, int y)
//////////////////////////////////////////////////
Tile* Map::getTile(int x, int y)
{
    // Are the indices a real grid space?
    if (x < 0 || x >= width || y < 0 || y >= height)
    {
        return NULL;    // Should be an exception
    }

    return grid[y*width + x];
}


//////////////////////////////////////////////////
//  Tile* Map::getTile(sf::Vector2i coords)
//////////////////////////////////////////////////
Tile* Map::getTile(sf::Vector2i coords)
{
    return getTile(coords.x, coords.y);
}

//////////////////////////////////////////////////
//  void Map::setTile(Tile* tile, int x, int y)
//////////////////////////////////////////////////
void Map::setTile(Tile* tile, int x, int y)
{
    // Are the indices a real grid space?
    if (x < 0 || x > width || y < 0 || y > height)
    {
        return; // Should be an exception
    }

    if (getTile(x, y))
    {
        delete getTile(x, y);
    }

    grid[y*width + x] = tile;
}

//////////////////////////////////////////////////
//  void Map::setTile(sf::Vector2i coords)
//////////////////////////////////////////////////
void Map::setTile(Tile* tile, sf::Vector2i coords)
{
    setTile(tile, coords.x, coords.y);
}


